// utils/api.js - API请求封装
const app = getApp()

const BASE_URL = 'https://naturedao.tech/api/v1'

/**
 * 发起HTTP请求
 */
function request(url, method = 'GET', data = {}, options = {}) {
  return new Promise((resolve, reject) => {
    const token = wx.getStorageSync('token')
    console.log('📤 请求:', method, url, '| Token:', token ? `${token.substring(0, 20)}...` : '无')
    
    const header = {
      'Content-Type': 'application/json',
      ...options.header
    }
    
    if (token) {
      header['Authorization'] = `Bearer ${token}`
      console.log('✅ Token已添加到请求头')
    } else {
      console.warn('⚠️ 未找到Token，请求可能失败')
    }

    // 不自动显示loading（由调用方决定）
    if (options.showLoading !== false) {
      wx.showLoading({
        title: options.loadingText || '加载中...',
        mask: true
      })
    }

    wx.request({
      url: BASE_URL + url,
      method: method,
      data: data,
      header: header,
      timeout: options.timeout || 30000,
      success: (res) => {
        if (options.showLoading !== false) {
          wx.hideLoading()
        }
        
                console.log('API响应:', url, res)
                
                if (res.statusCode === 200) {
                  // 检查返回数据格式
                  if (typeof res.data === 'string') {
                    try {
                      res.data = JSON.parse(res.data)
                    } catch (e) {
                      console.error('JSON解析失败:', res.data)
                      if (!options.silent) {
                        wx.showToast({
                          title: 'API返回数据格式错误',
                          icon: 'none'
                        })
                      }
                      reject(new Error('Invalid JSON data'))
                      return
                    }
                  }
                  
                  // 处理Odoo JSON-RPC格式响应
                  // Odoo type='json' 路由返回格式: {jsonrpc: "2.0", result: {...}}
                  if (res.data && res.data.jsonrpc === "2.0") {
                    if (res.data.result) {
                      // 正常响应，提取result
                      res.data = res.data.result
                    } else if (res.data.error) {
                      // 错误响应
                      console.error('Odoo RPC错误:', res.data.error)
                      if (!options.silent) {
                        wx.showToast({
                          title: res.data.error.message || '请求失败',
                          icon: 'none'
                        })
                      }
                      reject(res.data.error)
                      return
                    }
                  }
                  
                  resolve(res.data)
        } else if (res.statusCode === 401) {
          // token失效，跳转登录
          if (!options.silent) {
            wx.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            })
          }
          if (app && app.logout) {
            app.logout()
          }
          reject(res.data || new Error('Unauthorized'))
        } else if (res.statusCode === 404) {
          if (!options.silent) {
            wx.showToast({
              title: 'API接口不存在',
              icon: 'none'
            })
          }
          reject(new Error('API not found'))
        } else {
          if (!options.silent) {
            wx.showToast({
              title: res.data?.message || '请求失败',
              icon: 'none'
            })
          }
          reject(res.data || new Error('Request failed'))
        }
      },
      fail: (err) => {
        if (options.showLoading !== false) {
          wx.hideLoading()
        }
        console.error('网络请求失败:', url, err)
        if (!options.silent) {
          wx.showToast({
            title: '网络请求失败，请检查网络',
            icon: 'none'
          })
        }
        reject(err)
      }
    })
  })
}

/**
 * GET请求
 */
function get(url, data = {}, options = {}) {
  return request(url, 'GET', data, options)
}

/**
 * POST请求
 */
function post(url, data = {}, options = {}) {
  return request(url, 'POST', data, options)
}

/**
 * PUT请求
 */
function put(url, data = {}, options = {}) {
  return request(url, 'PUT', data, options)
}

/**
 * DELETE请求
 */
function del(url, data = {}, options = {}) {
  return request(url, 'DELETE', data, options)
}

/**
 * 上传头像（带压缩）
 * @param {string} tempFilePath - 临时文件路径
 * @returns {Promise} - 返回服务器URL
 */
function uploadAvatar(tempFilePath) {
  return new Promise(async (resolve, reject) => {
    try {
      // 1. 压缩图片
      console.log('📸 压缩头像中...')
      const compressRes = await new Promise((res, rej) => {
        wx.compressImage({
          src: tempFilePath,
          quality: 80,
          success: res,
          fail: rej
        })
      })
      
      console.log('✅ 头像压缩完成')
      
      // 2. 上传到服务器
      const token = wx.getStorageSync('token')
      
      wx.showLoading({
        title: '上传头像中...',
        mask: true
      })
      
      wx.uploadFile({
        url: BASE_URL + '/upload/avatar',
        filePath: compressRes.tempFilePath,
        name: 'file',
        header: {
          'Authorization': `Bearer ${token}`
        },
        success: (res) => {
          wx.hideLoading()
          console.log('📤 头像上传响应:', res)
          
          if (res.statusCode === 200) {
            const data = typeof res.data === 'string' ? JSON.parse(res.data) : res.data
            
            if (data.success && data.data && data.data.avatar_url) {
              console.log('✅ 头像上传成功:', data.data.avatar_url)
              resolve(data.data.avatar_url)
            } else {
              reject(new Error(data.message || '上传失败'))
            }
          } else {
            reject(new Error(`HTTP ${res.statusCode}`))
          }
        },
        fail: (error) => {
          wx.hideLoading()
          console.error('❌ 头像上传失败:', error)
          reject(error)
        }
      })
    } catch (error) {
      wx.hideLoading()
      console.error('❌ 头像处理失败:', error)
      reject(error)
    }
  })
}

/**
 * 上传文件
 */
function uploadFile(filePath, name = 'file', formData = {}) {
  return new Promise((resolve, reject) => {
    const token = wx.getStorageSync('token')
    const header = {}
    
    if (token) {
      header['Authorization'] = `Bearer ${token}`
    }

    wx.showLoading({
      title: '上传中...',
      mask: true
    })

    wx.uploadFile({
      url: BASE_URL + '/upload',
      filePath: filePath,
      name: name,
      formData: formData,
      header: header,
      success: (res) => {
        wx.hideLoading()
        
        const data = JSON.parse(res.data)
        if (data.code === 200) {
          resolve(data)
        } else {
          wx.showToast({
            title: data.message || '上传失败',
            icon: 'none'
          })
          reject(data)
        }
      },
      fail: (err) => {
        wx.hideLoading()
        wx.showToast({
          title: '上传失败',
          icon: 'none'
        })
        reject(err)
      }
    })
  })
}

module.exports = {
  request,
  get,
  post,
  put,
  del,
  uploadFile,
  uploadAvatar
}

